#include <signal.h>
#include <iostream>
#include <unistd.h>

using namespace std;

void ShowPending(sigset_t* pendings) {
    // 一共 31 个信号
    for (int sig = 1; sig <= 31; sig ++) {
        // 这个信号是否在未决信号集中
        if (sigismember(pendings, sig)) {
            cout << 1;;
        }
        else {
            cout << 0;
        }
    }
    cout << endl;
    sleep(1);
}

void handler(int signo) {
    cout << "你就是蠢驴" << endl;
}

int main() {
    // 不断获取当前进程的 pending 信号集
    signal(2, handler);
    sigset_t pendings;
    // 增加屏蔽信号集
    sigset_t blksig, o_blksig;
    // 先清空
    sigemptyset(&blksig);
    sigemptyset(&o_blksig);

    // 对2号信号增加信号屏蔽字, 但是没有设置到内核里面
    // sigaddset(&blksig, 2);
    sigfillset(&blksig);
    // SIG_SETMARK 直接将这个 sigset_t 信号集赋值给当前进程的信号屏蔽字中
    sigprocmask(SIG_SETMASK, &blksig, &o_blksig);

    while (true) {
        // 1. 清空未决信号集
        sigemptyset(&pendings);
        // 2. 获取当前进程信号集, 0 表示获取成功
        if (sigpending(&pendings) == 0) {
            ShowPending(&pendings);
        }
    }
    return 0;
}